package models;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import system.Model;

/**
 * Model PesananItem
 * 
 * @author Rezan Achmad
 */
public class PesananItem extends Model {

    public int pesanan_id;
    public int barang_id;
    public int jumlah;
    public int harga_satuan;

    public PesananItem() {
        harga_satuan = 0;
    }
    
    /**
     * Menambah item pesanan.
     * @return Mengembalikan true jika berhasil atau false jika gagal.
     */
    @Override
    public boolean add() {
        // Cek harga satuan
        if (harga_satuan <= 0) {
            // Get Barang
            Barang barang = Barang.get(barang_id);

            // Set harga satuan
            if (barang != null) {
                harga_satuan = barang.harga_satuan;
            } else {
                harga_satuan = 0;
            }
        }

        // Build SQL
        StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO `pesanan_item` VALUES('").append(pesanan_id).append("','").append(barang_id).append("','").append(jumlah).append("','").append(harga_satuan).append("')");

        try {
            // Insert
            getStatement().executeUpdate(sql.toString());

            // Update barang
            Barang barang = Barang.get(barang_id);
            barang.jumlah -= jumlah;
            barang.update();
            
            // Log
            Log.add(sql.toString());
        } catch (SQLException ex) {
            // Something error
            Logger.getLogger(Pesanan.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

        return true;
    }

    /**
     * Mengupdate item pesanan.
     * @return Mengembalikan true jika berhasil atau false jika gagal.
     */
    public boolean update() {
        // Cek jumlah barang
        if (Barang.get(barang_id).jumlah < jumlah) {
            return false;
        }

        // Get last data
        PesananItem temp = getById(pesanan_id, barang_id);

        // Build SQL
        StringBuilder sql = new StringBuilder();
        sql.append("UPDATE `pesanan_item` SET `jumlah`='").append(jumlah).append("', `harga_satuan`='").append(harga_satuan).append("' WHERE `pesanan_id`=").append(pesanan_id).append(" AND `barang_id`=").append(barang_id);

        try {
            // Insert
            getStatement().executeUpdate(sql.toString());

            // TODO Update barang
            Barang barang = Barang.get(barang_id);
            barang.jumlah = barang.jumlah + temp.jumlah - jumlah;
            barang.update();
            
            // Log
            Log.add(sql.toString());
        } catch (SQLException ex) {
            // Something error
            Logger.getLogger(Pesanan.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

        return true;
    }

    /**
     * Menghapus item pesanan.
     * @return Mengembalikan true jika berhasil atau false jika gagal.
     */
    public boolean delete() {
        // Build SQL
        StringBuilder sql = new StringBuilder();
        sql.append("DELETE FROM `pesanan_item` WHERE `pesanan_id`=").append(pesanan_id).append(" AND `barang_id`=").append(barang_id);
        try {
            // Delete
            getStatement().executeUpdate(sql.toString());

            // Update barang
            Barang barang = Barang.get(barang_id);
            barang.jumlah += jumlah;
            barang.update();
            
            // Log
            Log.add(sql.toString());
        } catch (SQLException ex) {
            // Something error
            Logger.getLogger(Pesanan.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

        return true;
    }

    /**
     * Mengambil daftar PesananItem berdasarkan query SQL.
     * @param sql Query SQL.
     * @return Mengembalikan Array List PesananItem jika ditemukan atau null jika tidak ditemukan.
     */
    public ArrayList<PesananItem> getAllBySql(String sql) {
        ArrayList<PesananItem> items = new ArrayList<PesananItem>();

        try {
            ResultSet rs = getStatement().executeQuery(sql);
            PesananItem item;

            while (rs.next()) {
                item = new PesananItem();
                item.setAttributes(rs);
                items.add(item);
            }

            return items;
        } catch (SQLException ex) {
            Logger.getLogger(PesananItem.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    /**
     * Mengambil daftar PesananItem berdasarkan pesanan_id.
     * @param sql Query SQL.
     * @return Mengembalikan Array List PesananItem jika ditemukan atau null jika tidak ditemukan.
     */
    public ArrayList<PesananItem> getAllByPesananId(int pesananId) {
        String sql = "SELECT * FROM `pesanan_item` WHERE `pesanan_id` = '" + pesananId + "'";
        return getAllBySql(sql);
    }

    /**
     * Mengambil PesananItem berdasarkan pesanan_id dan barang_id.
     * @param int pesananId.
     * @param int barangId
     * @return Mengembalikan PesananItem jika ditemukan atau null jika tidak ditemukan.
     */
    public PesananItem getById(int pesananId, int barangId) {
        String sql = "SELECT * FROM `pesanan_item` WHERE `pesanan_id` = '" + pesananId + "'";
        ArrayList<PesananItem> list = getAllBySql(sql);
        if (!list.isEmpty()) {
            for (int i = 0; i < list.size(); ++i) {
                if (list.get(i).barang_id == barangId) {
                    return list.get(i);
                }
            }
        }
        return null;
    }

    /**
     * Set semua attribut PesananItem
     * @param rs Result Set
     * @throws SQLException 
     */
    @Override
    public void setAttributes(ResultSet rs) throws SQLException {
        pesanan_id = rs.getInt("pesanan_item.pesanan_id");
        barang_id = rs.getInt("pesanan_item.barang_id");
        jumlah = rs.getInt("pesanan_item.jumlah");
        harga_satuan = rs.getInt("harga_satuan");
    }

    /**
     * Memperoleh instance baru dari PesananItem
     * @return Instance PesananItem
     */
    public static PesananItem getInstance() {
        return new PesananItem();
    }

    @Override
    public boolean validate() {
        return true;
    }

    @Override
    public void initAttributesLabel() {
    }
}
